EMR起動時に任意のソフトウェアを追加するには
EC2インスタンスを利用する際はカスタムAMI(ユーザーが自分自身で作成するAMI)を利用することがよくあると思います。一方、EMRではカスタムAMIが利用できません。その代わりEMRにはブートストラップアクションという機能が用意されています。 (オプション)追加のソフトウェアをインストールするためのブートストラップアクションの作成 - Amazon Elastic MapReduce
概要
ブートストラップアクションはEMRによって起動されるノード(EC2インスタンス)に対して、起動時に任意の処理を追加で実行できる仕組みです。イメージ的にはcloud-initのようなもので、S3バケット上に任意のスクリプトファイルを配備しておくと、起動時にそのスクリプトファイルをノード上で実行することが出来ます。実行ユーザーはhadoopユーザーとなりsudoコマンドを利用してroot権限でのコマンド実行も可能です。そのため、例えばyumコマンドを使って各ノードに任意のソフトウェアを追加でインストールしたりすることが可能です。
ブートストラップアクションの利用手順は以下の通りです。
- スクリプトファイルを作成する
- スクリプトファイルをS3にアップロードする
- EMR起動時にブートストラップアクションを追加する
利用手順
ブートストラップの利用手順について説明します。今回はGroovyをインストールしてみたいと思います。
スクリプトファイルを作成する
まずはGroovyをインストールするためのスクリプトファイルを作成します。
#!/bin/bash -ex # カレントをhadoopユーザーのホームディレクトリに変更する cd ~ wget http://dl.bintray.com/groovy/maven/groovy-binary-2.4.1.zip unzip groovy-binary-2.4.1.zip cat << 'EOF' >> .bashrc # Groovy export GROOVY_HOME=/home/hadoop/groovy-2.4.1 export PATH=$PATH:$GROOVY_HOME/bin EOF
ポイントとしてはcd ~という形でホームディレクトリに移動している所です。ブートストラップアクションのデフォルトの実行ディレクトリは/mnt/var/lib/bootstrap-actions/n/ *1であるため最初にhadoopユーザーののホームディレクトリに移動しています。また、ブートストラップアクションのデバッグ用にshebangを#!/bin/bash -exとしています。
スクリプトファイルをS3にアップロードする
次にinstall-groovy.shをS3にアップロードします。今回はemr.noto.example.comというS3バケットにアップロードしました。
EMR起動時にブートストラップアクションを追加する
ではEMRクラスタを起動します。起動時にブートストラップアクションを追加します。 [Add bootstrap action]のセレクトボックスで[Custom action]を選択し、[Configure and add]ボタンをクリックします。すると追加用の画面が表示されるのでS3にアップロードしたinstall-groovy.shを選択します。 後は普段通りにEMRクラスタを起動するだけです。
インストールされていることの確認
実際にGroovyがインストールされているか確認したいと思います。SSHでマスターノードに接続して下さい。
ssh hadoop@ec2-54-65-248-XXX.ap-northeast-1.compute.amazonaws.com -i ~/XXX.pem
ログイン後にGroovyがインストールされていることを確認します。
[hadoop@ip-172-31-18-160 ~]$ groovy -version Groovy Version: 2.4.1 JVM: 1.7.0_71 Vendor: Oracle Corporation OS: Linux
インストールされていますね。ではログも確認しましょう。ログは/mnt/var/log/bootstrap-actions/n/ *2に出力されるようになっています。
[hadoop@ip-172-31-18-160 ~]$ ll /mnt/var/log/bootstrap-actions/1/ 合計 64 -rw-r--r-- 1 hadoop hadoop 3202 2月 20 03:57 controller -rw-r--r-- 1 hadoop hadoop 50295 2月 20 03:57 stderr -rw-r--r-- 1 hadoop hadoop 4697 2月 20 03:57 stdout
shebangで-xオプションを指定してるためstderrファイルにトレースログが出力されます。
[hadoop@ip-172-31-18-160 ~]$ head -n 3 /mnt/var/log/bootstrap-actions/1/stderr + cd /home/hadoop + wget http://dl.bintray.com/groovy/maven/groovy-binary-2.4.1.zip --2015-02-20 03:57:14-- http://dl.bintray.com/groovy/maven/groovy-binary-2.4.1.zip
まとめ
ブートストラップアクションを利用する上で留意点をまとめておきます。
- 実行ユーザーhadoop(sudoは可能)
- hadoopユーザーのホームディレクトリは/home/hadoop
- 実行時のカレントディレクトリは/mnt/var/lib/bootstrap-actions/n/となるので必要に応じてcdする。もしくは絶対パスで操作する
- ログは/mnt/var/log/bootstrap-actions/n/に出力される。
ブートストラップアクションは実行時に引数を渡すことも可能です。また、今回紹介したものはカスタムアクションになりますが、Hadoopの設定ファイルを変更するために予め用意されているアクションも存在します。詳細はドキュメントをご参照下さい。 (オプション)追加のソフトウェアをインストールするためのブートストラップアクションの作成 - Amazon Elastic MapReduce
最後に
ブートストラップアクションは任意のスクリプトファイルを実行することができるため、BashだけでなくRubyやPythonを利用することも可能です。GitHubのawslabsに色々なソフトウェアのブートストラップアクションが公開されているため、そのまま利用するでもいいですし、自分でブートストラップアクションを作成する際の参考にもしてもらえればと思います。 awslabs/emr-bootstrap-actions